<?php
/**
 +------------------------------------------------------------------------------
 * filecacache类；
 * 在缓存有效期内，对缓存进行保护，不到过期永远不rewrite filecache；
 * 保证缓存的有效性、叫少io操作，如果想生效，请清理缓存。
 +------------------------------------------------------------------------------
 * @Version 1.2
 * @Author  WangXian
 * @E-mail   admin@loopx.cn
 * @package others
 * @FileName Filecache.class.php
 * @Creation date 2010-10-15
 * @Modified date 2010-10-21 23:08:57
 +------------------------------------------------------------------------------
 */
class Filecache
{
	/**
	 +----------------------------------------------------------
	 * 数据缓存&文件缓存
	 +----------------------------------------------------------
	 * @param string $name 缓存名称
	 * @param string $value 缓存值
	 * @param integer $expire 缓存有效期，默认3600s
	 * @param string $cacheStoreType 缓存类型，是用 serialize 或 array 存储
	 +----------------------------------------------------------
	 * @return array
	 +----------------------------------------------------------
	 */
	public static function cache($name,$value='',$expire=3600,$cacheStoreType = 'array')
	{
		if(true == ( $dir_pos = strrpos($name ,'/') ) )
		{//有子目录，也可能有多层子目录。
			
			$cache_name = substr($name,$dir_pos+1);
			
			//缓存目录
			$cache_dir = APP_PATH.'/runtime/cache/'.substr($name, 0, $dir_pos) . '/';
			if( ! is_dir($cache_dir)) mkdir($cache_dir,0777,TRUE);//递归创建文件夹
		}
		else
		{//无子目录
			$cache_name = $name;
			$cache_dir=APP_PATH.'/runtime/cache/';//缓存名称
		}
		#缓存文件名
		$filename = $cache_dir . trim($cache_name) .'^'. md5($cache_name) .'.php';
		
		#缓存状态: 1,缓存有效 0,过期 -1,不存在
		$ck=self::_cacheStatus($filename);
		
		if(is_null($value)) {return unlink($filename);} #删除缓存
		else
		{
			if($cacheStoreType == 'array')
			{
				if($ck < 1) #ck=0，-1的情况,即缓存 不存在 或 过期；
				{
					if(empty($value)) {return false;}#value值为空时，不缓存，提高效率！
					else
					{
						file_put_contents($filename, '<?php return '. var_export($value,true) .';?>' );
						self::_cacheIndex($filename,$expire);
						return $value;
					}
				}
				#读取有效期内的缓存，即使value不为空，也不重写；
				else if($ck==1) { return require($filename); }
			}
			else
			{
				if($ck < 1) #ck=0，-1的情况,即缓存 不存在 或 过期；
				{
					if(empty($value)) {return false;}
					else
					{
						file_put_contents($filename, serialize($value) );
						self::_cacheIndex($filename,$expire);
						return $value;
					}
				}
				#读取有效期内的缓存，即使value不为空，也不重写；
				else if($ck==1) { return unserialize(file_get_contents($filename)); }
			}
		}
		
		return '';
	}
	
	
	/**
	 * 缓存状态检测
	 *
	 * @param string $filename 文件名
	 * @return integer 1,缓存有效 0,过期 -1,不存在
	 */
	static function _cacheStatus($filename)
	{//1,缓存有效 0,过期 -1,不存在
		//echo $filename;
		if( file_exists($filename) )
		{
			$expire=self::_cacheIndex($filename);
			if($expire==-1)
			{ return 1; }
			else
			{
				if( time() - filemtime($filename) > $expire )
				{ return 0;}
				else
				{ return 1;}
			}
		}
		else
		{return -1;}
	}
	
	
	/**
	 *
	 * 过期时间$expire处理,$expire==''获取 $expire有值为设置
	 *
	 * @param string $filename 文件名
	 * @param unknown_type $expire 有效期
	 * @return array
	 */
	static function _cacheIndex($filename,$expire='')
	{
		$index_file = dirname($filename).'/~index.php';  //缓存路径
		
		#缓存有效期
		if( file_exists($index_file) )
			$arr= include($index_file);
		else
			$arr = array();
		
		#获取 或 写expire有效期
		if($expire=='')
			return empty( $arr[basename($filename)] )?0:$arr[basename($filename)];
		else
		{
			$arr[basename($filename)]=$expire;
			file_put_contents($index_file,'<?php return '.var_export($arr,true).';?>');
			//return $expire;
			return ;
		}
	}

}